package 剑指offer_leetcode;

/**
 * JZ65不用加减乘除做加法
 */
public class 剑指Offer65_不用加减乘除做加法 {
    //位运算非递归
    // 进位  1 1 -> 1 &
    // 两位相加  -> ^
    public int add(int a, int b) {
        // add表示进位值
        int add = b;
        // sum表示总和
        int sum = a;
        // 当不再有进位的时候终止循环
        while(add != 0) {
            // 将每轮的无进位和与进位值做异或求和
            int temp = sum ^ add;  //求和  ^ 同0异1
            // 进位值是用与运算产生的
            add = (sum & add) << 1; //进位 同为1才为 (1进位)
            // 更新sum为新的和
            sum = temp;
        }
        return  sum;
    }
}
